package com.spring.demo.propagation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * @version 1.0.0
 * @Date: 2022/6/1 14:58
 * @Author ZhuYouBin
 * @Description
 */
@Component
public class ServiceB {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    // 定义事务传播机制: NESTED
    @Transactional(propagation = Propagation.NESTED)
    public void methodB() {
        System.out.println("3、调用ServiceB类中的methodB方法......");
        // 调用转账方法
        this.transferMoney();
    }










//    // 定义事务传播机制: NEVER
//    @Transactional(propagation = Propagation.NEVER)
//    public void methodB() {
//        System.out.println("3、调用ServiceB类中的methodB方法......");
//        // 调用转账方法
//        this.transferMoney();
//    }



//    // 定义事务传播机制: NOT_SUPPORTED
//    @Transactional(propagation = Propagation.NOT_SUPPORTED)
//    public void methodB() {
//        System.out.println("3、调用ServiceB类中的methodB方法......");
//        // 调用转账方法
//        this.transferMoney();
//    }


//    // 定义事务传播机制: REQUIRES_NEW
//    @Transactional(propagation = Propagation.REQUIRES_NEW)
//    public void methodB() {
//        System.out.println("3、调用ServiceB类中的methodB方法......");
//        // 调用转账方法
//        this.transferMoney();
//    }


//    // 定义事务传播机制: MANDATORY
//    @Transactional(propagation = Propagation.MANDATORY)
//    public void methodB() {
//        System.out.println("3、调用ServiceB类中的methodB方法......");
//        // 调用转账方法
//        this.transferMoney();
//    }


//    // 定义事务传播机制: SUPPORTS
//    @Transactional(propagation = Propagation.SUPPORTS)
//    public void methodB() {
//        System.out.println("3、调用ServiceB类中的methodB方法......");
//        // 调用转账方法
//        this.transferMoney();
//    }

    // 定义事务传播机制: 默认就是 REQUIRED
//    @Transactional(propagation = Propagation.REQUIRED)
//    public void methodB() {
//        System.out.println("3、调用ServiceB类中的methodB方法......");
//        // 调用转账方法
//        this.transferMoney();
//    }



    // 模拟转账功能
    public void transferMoney() {
        // A用户减少1000元
        String sql = "UPDATE spring.t_money SET balance = balance - 1000  WHERE id = 10001";
        int update = jdbcTemplate.update(sql);
        System.out.println("A用户减少1000元成功: " + update);
        // 模拟转账过程中出现异常
        int i = 10 / 0;
        // B用户增加1000元
        sql = "UPDATE spring.t_money SET balance = balance + 1000  WHERE id = 10002";
        update = jdbcTemplate.update(sql);
        System.out.println("B用户减少1000元成功: " + update);
    }

}
